/*
 * Licensed to the 南京汇海交通科技有限公司
 *
 * Copyright (c) 2025.
 * All rights reserved.
 *
 * 本软件属南京汇海交通科技有限公司所有，在未获得南京汇海交通科技有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.cje.client.support;

import feign.Feign;
import feign.Logger;
import feign.Request;
import feign.RequestInterceptor;
//import feign.codec.Decoder;
//import feign.codec.Encoder;
import feign.slf4j.Slf4jLogger;
import org.springframework.stereotype.Component;

import feign.jackson.JacksonDecoder;
import feign.jackson.JacksonEncoder;
//import feign.ribbon.RibbonClient;

/**
 * FeignClient代理对象构造器
 * 具体请参考 https://www.cnblogs.com/chenkeyu/p/9017996.html
 */
@Component
public class FeignClientProxyBuilder {

    /**
     * 原生feign动态构建接口的代理对象
     *
     * @param baseUrl            外部接口或第三方平台API 在网络上的地址
     * @param clazz              接口的声明类型.class
     * @param requestInterceptor 请求头拦截器
     * @param <T>                接口的声明类型
     * @return 返回接口的代理对象
     */
    public <T> T proxy(String baseUrl, Class<T> clazz, RequestInterceptor requestInterceptor) {
        // return HystrixFeign.builder().target(MyService.class, "https://myAppProd");
        return Feign.builder() // .client(RibbonClient.create())
                .encoder(new JacksonEncoder()) // .encoder(new Encoder.Default())
                .decoder(new JacksonDecoder()) // .decoder(new Decoder.Default())
                .contract(new feign.Contract.Default())
                .options(new Request.Options())
                .logger(new Slf4jLogger(clazz))
                .logLevel(Logger.Level.FULL)
                .requestInterceptor(requestInterceptor)
                .decode404()
                .target(clazz, baseUrl);
    }

}
